package practice.Day31;

import java.util.Scanner;

/**
 * @Author quan
 * @Description 美国节日
 * @Date 2023/7/3 20:11
 */
public class Num1_AmericanDays {
    /**
     * 对应问题1：传入年月日通过蔡勒公式计算当前是星期几？
     * @param year 年
     * @param month 月
     * @param day 日
     * @return 当前年月日下对应的星期数
     */
    public static int day_of_week(int year,int month,int day){
        //(1)对月份进行处理
        if(month == 1 || month == 2){
            //如果当前月份是1月或者是2月，看作是13月和14月，并且年份-1
            month+=12;
            year-=1;
        }
        //对年份进行处理
        int century = year / 100;//2064就是20世纪
        year = year % 100;//2064就是64年
        //(2)带入公式---问题1
        int week = (year+year/4+century/4-2*century+(26*(month+1))/10+day-1);
        week = (week % 7+7)%7; //---这里要注意有负数的问题，注意对负数的取模运算！如 -12 % 7 不是星期五 而是 星期二
//        week = week % 7;
        //(3)返回结果：week = 0,对应是星期天；week = 1,对应星期一...
        if(week== 0){
            week = 7;
        }
        return week;
    }

    /**
     * 对应问题2：根据1号是星期W,求第count个星期day_of_week是几号？
     * @param year 年
     * @param month 月
     * @param count 第n个星期
     * @param day_of_week 所求的星期数
     * @return
     */
    public static int day_of_demand(int year, int month,int count,int day_of_week){
        //（1）根据公式计算本月的1号是星期几，作为参考
        int week = day_of_week(year,month,1);
        //（2）根据公式计算出 是多少号---问题2
        return(7+day_of_week-week) % 7 + 1+(count-1)*7 ;
    }

    /**
     * 对应问题3：根据6月1日是星期W，求5月的最后一个星期一
     * @param year 年
     * @return
     */
    public static int may(int year){
        //（1）根据年月日求出所在星期数
        int week = day_of_week(year,6,1);
        //（2）根据公式求出5月的最后一个星期一是几号---问题3
        int day = (week == 1 ? 7 : week-1);
        return 32-day;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()){
            int year = sc.nextInt();
            //元旦
            System.out.printf("%d-01-01\n",year);
            //一月的第三个星期一:马丁·路德 金纪念日
            System.out.printf("%d-01-%02d\n",year,day_of_demand(year,1,3,1));
            //2月的第三个星期一：总统节
            System.out.printf("%d-02-%02d\n",year,day_of_demand(year,2,3,1));
            // 5月的最后一个星期一：阵亡将士纪念日
            System.out.printf("%d-05-%02d\n",year,may(year));
            //7月4日：美国国庆
            System.out.printf("%d-07-04\n",year);
            //9月的第一个星期一：劳动节
            System.out.printf("%d-09-%02d\n",year,day_of_demand(year,9,1,1));
            //11月的第四个星期四：感恩节
            System.out.printf("%d-11-%02d\n",year,day_of_demand(year,11,4,4));
            //12月25日：圣诞节
            System.out.printf("%d-12-25\n",year);
            System.out.println();
        }
    }
}
